//
//  HomeViewController.swift
//  JKWeiBo
//
//  Created by 王冲 on 2017/5/18.
//  Copyright © 2017年 希爱欧科技有限公司. All rights reserved.

import UIKit
import SVProgressHUD
import SDWebImage
import MJRefresh
private let HomereuseIdentifier = "HomereuseIdentifier"

class HomeViewController: BaseViewController{
    
    // 顶部刷新
    let header = MJRefreshNormalHeader()
    // 底部刷新
    let footer = MJRefreshAutoNormalFooter()
 
    // 用于保存微博数组
    var homeViewModels: [HomeViewModel]?
    {
        didSet{
            
            //self.tableview.reloadData()
        }
        
    }
    

    override func viewDidLoad() {
        super.viewDidLoad()
        

        
        print("打印高度=\(JKscreenH) 宽度=\(JKscreenW) ")
        
        // 1.如果没有登录就设置未登录的信息
        if !userLogin {
            
            vistorView?.setupVistorInfo(isHome: true, image: "visitordiscover_feed_image_house", message: "关注一些人，回这里看看有什么惊喜")
        }else{
        
            // 2.初始化导航条的内容(已经登陆过的情况)
            setUpNav()
       
            // 3..注册通知
            NotificationCenter.default.addObserver(self, selector: #selector(HomeViewController.change), name: NSNotification.Name(rawValue: JKPopoverAnimatorWillshow), object: nil)
            NotificationCenter.default.addObserver(self, selector: #selector(HomeViewController.change), name: NSNotification.Name(rawValue: JKPopoverAnimatorWilldismiss), object: nil)
            NotificationCenter.default.addObserver(self, selector: #selector(HomeViewController.presentBrower), name: NSNotification.Name(rawValue: HomePhotoBrowser), object: nil)
            
            //四周均不延伸
            self.edgesForExtendedLayout = []
            
            self.view.addSubview(self.tableview)
            
            //self.tableview.register(HomelForwardTableViewCell.self, forCellReuseIdentifier: HomeTableViewCellIdentifier.ForwardCell.rawValue)
             self.tableview.register(HomelNormalTableViewCell.self, forCellReuseIdentifier: HomeTableViewCellIdentifier.NormalCell.rawValue)
            
            // 下拉刷新
            
            header.setRefreshingTarget(self, refreshingAction: #selector(HomeViewController.headerRefresh))
            // 现在的版本要用mj_header
            /*
            header.setTitle("下拉刷新", for: .idle)
            header.setTitle("释放更新", for: .pulling)
            header.setTitle("正在刷新...", for: .refreshing)
            */
            self.tableview.mj_header = header
            
            // 上拉刷新
            footer.setRefreshingTarget(self, refreshingAction: #selector(HomeViewController.footerRefresh))
            self.tableview.mj_footer = footer
            self.tableview.mj_footer.isHidden = true
            header.beginRefreshing()
            
            let headView2 = UIView(frame: CGRect(x: 0, y: 0, width: JKscreenW, height: 10))
            headView2.backgroundColor = UIColor.red
            self.tableview.tableHeaderView = headView2
            
            let footView2 = UIView(frame: CGRect(x: 0, y: 0, width: JKscreenW, height: 10))
            footView2.backgroundColor = UIColor.red
            self.tableview.tableFooterView = footView2
        }
        
    }
    
    // MARK: 进入图片浏览器
    func presentBrower(notify: Notification){
        
        // print(notify.userInfo)
        // 注意: 如果通过通知传递数据, 一定要判断数据是否存在
        guard let indexPath = notify.userInfo![HomePhotoBrowserIndexkey] as? NSIndexPath else
        {
            print("没有indexPath")
            return
        }
        
        guard let urls = notify.userInfo![HomePhotoBrowserPicurekey] as? [NSURL] else
        {
            print("没有配图")
            return
        }
        
        print("indexPath=\(indexPath) urls=\(urls)")
        
        // 1.创建图片浏览器
        let vc = PhotoBrowserCollectionViewController(index: indexPath.item, picurls: urls)
        
        // 2.显示图片浏览器
        present(vc, animated: true, completion: nil)
    }
    
    // 顶部刷新
    func headerRefresh(){
        print("下拉刷新")
        // 请求首页的数据
        homeData()
    }
    
    // 底部刷新
    func footerRefresh(){
        
        print("上拉刷新")
        
        let moreID = homeViewModels?.last?.id ?? 0
        
        print("moreID = \(moreID)")
        
        HomeViewModel.loadStause(more_ID: moreID) { (models, error) in
            
            // 结束刷新
            self.tableview.mj_footer.endRefreshing()
            
            if error != nil
            {
                SVProgressHUD.showSuccess(withStatus: "加载失败")
                return
            }
            
            self.homeViewModels = self.homeViewModels! + models!
            
            // 如果是上拉加载更多, 就将获取到的数据, 拼接在原有数据的后面
            if self.homeViewModels?.last?.id == 0
            {
                self.tableview.mj_footer.isHidden = true
                
            }else{
                
                self.tableview.mj_footer.isHidden = false
            }
            
            self.tableview.reloadData()
        }
    }
    
    /**
     获取微博数据
     如果想调用一个私有的方法:
     1.去掉private
     2.@objc, 当做OC方法来处理
     */
    
    // MARK: 首页的数据
    func homeData() {
       
        /*
         1.默认最新返回20条数据
         2.since_id : 会返回比since_id大的微博
         3.max_id: 会返回小于等于max_id的微博
         
         每条微博都有一个微博ID, 而且微博ID越后面发送的微博, 它的微博ID越大
         递增
         
         新浪返回给我们的微博数据, 是从大到小的返回给我们的
         
         15
         14
         13
         12
         11
         
         10
         9
         8
         7
         6
         5
         
         5
         4
         3
         2
         1
         
         */
        SVProgressHUD.show(withStatus: "正在加载")
    
        HomeViewModel.loadStause(more_ID: 0) { (models, error) in
            
            SVProgressHUD.dismiss()
            // 结束刷新
            self.tableview.mj_header.endRefreshing()
            
            if error != nil
            {
                SVProgressHUD.showSuccess(withStatus: "加载失败")
                return
            }
            
            SVProgressHUD.showSuccess(withStatus: "加载成功")
            
            self.homeViewModels = models
            
            if self.homeViewModels?.last?.id == 0
            {
                self.tableview.mj_footer.isHidden = true
                
            }else{
                
                self.tableview.mj_footer.isHidden = false
            }
            
            //print(self.homeViewModels!.count)
            self.tableview.reloadData()
            
        }
        
    }
    
    /*
     * 修改标题按钮的状态
     */
    func change() {
       
        let tittleBtn = navigationItem.titleView as! TittleBtn
        tittleBtn.isSelected = !tittleBtn.isSelected
        
    }
    
    // MARK: deinit 相当于 delloc
    deinit
    {
        // 移除通知
        NotificationCenter.default.removeObserver(self)
    }
    
    
    // MARK: 初始化导航条内容
    private func setUpNav(){
    
        // 一.系统的设置导航条内容
        //navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage(named:"navigationbar_friendattention"),style:UIBarButtonItemStyle.plain,target:self,action:#selector(HomeViewController.KK))
    
        // 自定义button来设置导航条内容
        // 1.设置左边的按钮
  
        // 调用类的封装来创建 UIBarButtonItem
        navigationItem.leftBarButtonItem = UIBarButtonItem.createBarbuttonItem(name: "navigationbar_friendattention", target: self, action: #selector(HomeViewController.leftAction))
        
        navigationItem.rightBarButtonItem = UIBarButtonItem.createBarbuttonItem(name: "navigationbar_pop", target: self, action: #selector(HomeViewController.rightAction))
        
        // 2.自定义标题按钮
        let btn = TittleBtn()
        btn.setTitle("JoanKing ", for: UIControlState.normal)
        btn.addTarget(self, action: #selector(HomeViewController.tittleClick(btn:)), for: UIControlEvents.touchUpInside)
        navigationItem.titleView = btn
    }
    
    // MARK: 标题的点击方法
    func tittleClick(btn:TittleBtn){

        print("标题的点击方法")
        // 1.设置按钮点击状态
       
        // 2.创建控制器对象
        let popoverViewController = PopoverViewController()
        // 3.设置转场代理, 告诉系统谁来负责转场 popoverAnimator: 是负责转场的
        popoverViewController.transitioningDelegate = popoverAnimator
        // 4.设置转场模式
        popoverViewController.modalPresentationStyle = UIModalPresentationStyle.custom
        present(popoverViewController, animated: true, completion: nil)
        
    }
    
    // MARK: 点击左边的个人
     func leftAction(){
    
        print("点击了左边")
        let account = UserAccount.loadAccount()
        print(account!)

     }
    
    // MARK: 点击了右边的扫一扫
    func rightAction(){
    
        let qRCodeViewController = QRCodeViewController()
        present(qRCodeViewController, animated: true, completion: nil)
    }
    
    // MARK: 转场封装的懒加,一定要自定义一个转场对象,否则会报错
    private lazy var popoverAnimator: PopoverAnimator = {
    
        let pop = PopoverAnimator()
        pop.presentFrame =  CGRect(x:JKscreenW/2.0-100,y:56,width:200,height:300)
        return pop
    
    }()
    
    lazy var tableview : UITableView = {
        
        // tabview的创建,遵守协议是用逗号 "," 来实现的
        let tableview = UITableView(frame:CGRect(x:0,y:0,width:JKscreenW,height:JKscreenH-64-49), style:.grouped)
        // tableview的背景色
        tableview.backgroundColor = UIColor.white
        // tableview挂代理
        tableview.delegate = self
        tableview.dataSource = self
        // tableview的分割方式
        tableview.separatorStyle = UITableViewCellSeparatorStyle.none
        return tableview
    }()

}

// MARK: 苹果官方推荐将数据源代理方法单独写到一个拓展方法里面,以便提高代码的可读性
// extension: 相当于OC里面的 category 这样代码更简洁
extension HomeViewController:UITableViewDelegate,UITableViewDataSource{
    
    // MARK: tableView段里面的 段落 数
    func numberOfSections(in tableView: UITableView) -> Int {
        
        return 1
    }
    
    // MARK: tableView段里面的 行 数
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return homeViewModels?.count ?? 0
    }
    
    // MARK: tableView cell 的设置
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
//        var cell = tableView.dequeueReusableCell(withIdentifier: HomereuseIdentifier) as?  HomelTableViewCell
//
//        if cell == nil {
//            cell = HomelTableViewCell(style:UITableViewCellStyle.default, reuseIdentifier: HomereuseIdentifier)
//            cell?.selectionStyle = UITableViewCellSelectionStyle.none
//
//        }
        
        let model = homeViewModels![indexPath.row]
        
        let cell = tableView.dequeueReusableCell(withIdentifier: HomeTableViewCellIdentifier.NormalCell.rawValue, for: indexPath) as! HomelTableViewCell
        cell.selectionStyle = UITableViewCellSelectionStyle.none
        
        cell.homeViewModel = model
        
        cell.footview.block = { (btnTag) -> Void in
            
            print("点击的第%ld行",indexPath.row)
            
            switch btnTag {
            case 101:
                
                print("转发")
                
            case 102:
                
                print("赞")
                
            case 103:
                
                print("评论")
                
            default: break
                
            }
        }
        
        return cell
    }
    
    // MARK: tableView 的点击事件
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        
        print("\(indexPath.section)段,\(indexPath.row)行")
    }
    
    // MARK: tableView cell 的高度返回值
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        
        let model = homeViewModels![indexPath.row]
        
        print("当前是哪一行=\(indexPath.row)")
        
        //let model1: HomeViewModel = model.retweeted_status != nil ? model : model
        
//        if model.retweeted_status != nil {
//
//              return 74+10+10+NSString.JKtextStringHeight(string: model.text! as NSString, size: CGSize(width:JKscreenW-24,height:1000), fontSize: 14)+calculateImageSize2(homeViewModel: model1).height+10+44
//
//        }else{
        
        var height1 : CGFloat? = 0
        
        height1 = model.storedPic_urls != nil ? calculateImageSize2(homeViewModel: model).height+10 : calculateImageSize2(homeViewModel: model).height
        let attributedString:NSAttributedString = JKEmoticonAttributedString().backwards(str: (model.text)!, font: 14)!
        
        return 74+JKwideHighSize().attributedStringSize(aString: attributedString, width: JKscreenW, height: CGFloat(MAXFLOAT), font: 14).height + height1! + 10 + 44
        
        
//        }
    }
    
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

        let headView1 = UIView(frame: CGRect(x: 0, y: 0, width: JKscreenW, height: 10))
        headView1.backgroundColor = UIColor.brown
        return headView1
    }

    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

        return 10
    }

    func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {

        let footView1 = UIView(frame: CGRect(x: 0, y: 0, width: JKscreenW, height: 0.01))
        footView1.backgroundColor = UIColor.purple
        return footView1
    }

    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        
        return 0.01
    }
    
    private func calculateImageSize2(homeViewModel: HomeViewModel) -> CGSize{
    
        // 0.获取图片的数量
        let count = homeViewModel.storedPic_urls?.count
        let itemSize = CGSize(width: 90, height: 90)
        let margin:CGFloat = 10
        // 1.没有图片
        if count == 0 || count == nil
        {
            return CGSize.zero
        }
        
        // 2.单张图片
        if count == 1
        {
            // 2.1从缓存中拿到图片
            let key = homeViewModel.storedPic_urls?.first?.absoluteString
            let image = SDWebImageManager.shared().imageCache?.imageFromDiskCache(forKey: key)
            if image == nil
            {
                return itemSize
            }
            
            // 2.2返回大小
            return image!.size
            
        }
        
         //3.四张图片
        if count == 4
        {
           let width = itemSize.width * CGFloat(2) + margin
           return CGSize(width: width, height: width)
        }
        // 4.其它多图
        /*
         2,3 -> 1
         5,6 -> 2
         7,8,9 -> 3
         */
        let colCount = 3
        let rowCount = (count! - 1) / 3 + 1
        // 宽度 * 列数 + (列数 - 1) * 间隙
        let width = itemSize.width * CGFloat(colCount) + CGFloat(colCount - 1) * margin
        // 高度 * 行数 + (行数 - 1) * 间隙
        let height = itemSize.height * CGFloat(rowCount) + CGFloat(rowCount - 1) * margin
        return CGSize(width: width, height: height)
    }
}
